<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // 闭包函数：用一个函数包裹其他函数即构建成闭包结构
        // 借助于函数本身局部作用域的特性，通过返回函数，可以扩展函数的取值范围
        // 可以防止全局变量被污染

        // var num="全局变量num";
        // function f1(){
        //     var num=0;
        //     return function(){
        //         console.log(num);
        //         num++;
        //     };
        // }
        // var res=f1();
        // res();
        // res();
        // res();
        // IIFE(Imdiately Invoked Function Expression):立即执行的函数表达式
        var num2="全局变量num2";
        var f2=(function(){
            var num2=0;
            return function(){
                console.log(num2);
                num2++;
            };
        })();
        console.log(f2);
        f2();
        f2();
        f2();

        // ES6中语法是具有块级作用域的概念
        // 虽然函数定义在代码块中，但是因为该函数是ES5中普通函数定义的方式，没有块级作用域的概念
        // 所以在代码块外面可以调用f5函数
        let num3=100;
        {
            let a="alice";
            console.log(a);
            let num3=9;
            function f5(){
                console.log("代码块中的num3:"+num3);
                num3++;
            }
        }
      
        f5();
        f5();

        // 结论:
        // IIFE和块作用域
        //     IIFE : (Imdiately Invoked Function Expression ) 立即执行的函数表达式
        //     ES5 语法中没有块作用域，因此在实际项目开发中，为避免全局变量因变量提升被污染会采用IIFE模式；
        //     ES6 语法中let 被构建了块作用域，因此可以使用块定义方式替代IIFE模式


    </script>
</head>
<body>
    
</body>
</html>